home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch12 / VbDraw.frm < prev    next >
Text File  |  1999-06-19  |  44KB  |  1,444 lines

  1. VERSION 5.00
  2. Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX"
  3. Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
  4. Begin VB.Form frmVbDraw 
  5.    BorderStyle     =   1  'Fixed Single
  6.    Caption         =   "VbDraw []"
  7.    ClientHeight    =   6585
  8.    ClientLeft      =   150
  9.    ClientTop       =   720
  10.    ClientWidth     =   9375
  11.    KeyPreview      =   -1  'True
  12.    LinkTopic       =   "Form1"
  13.    MaxButton       =   0   'False
  14.    MinButton       =   0   'False
  15.    ScaleHeight     =   6585
  16.    ScaleWidth      =   9375
  17.    StartUpPosition =   3  'Windows Default
  18.    Begin VB.PictureBox picHidden 
  19.       AutoRedraw      =   -1  'True
  20.       BackColor       =   &H00FFFFFF&
  21.       Height          =   615
  22.       Left            =   3840
  23.       ScaleHeight     =   555
  24.       ScaleWidth      =   555
  25.       TabIndex        =   10
  26.       Top             =   120
  27.       Visible         =   0   'False
  28.       Width           =   615
  29.    End
  30.    Begin MSComctlLib.ImageList imlFillStyles 
  31.       Left            =   1920
  32.       Top             =   2520
  33.       _ExtentX        =   1005
  34.       _ExtentY        =   1005
  35.       BackColor       =   -2147483643
  36.       ImageWidth      =   48
  37.       ImageHeight     =   16
  38.       MaskColor       =   12632256
  39.       _Version        =   393216
  40.       BeginProperty Images {2C247F25-8591-11D1-B16A-00C0F0283628} 
  41.          NumListImages   =   8
  42.          BeginProperty ListImage1 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  43.             Picture         =   "VbDraw.frx":0000
  44.             Key             =   ""
  45.          EndProperty
  46.          BeginProperty ListImage2 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  47.             Picture         =   "VbDraw.frx":0212
  48.             Key             =   ""
  49.          EndProperty
  50.          BeginProperty ListImage3 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  51.             Picture         =   "VbDraw.frx":0424
  52.             Key             =   ""
  53.          EndProperty
  54.          BeginProperty ListImage4 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  55.             Picture         =   "VbDraw.frx":0636
  56.             Key             =   ""
  57.          EndProperty
  58.          BeginProperty ListImage5 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  59.             Picture         =   "VbDraw.frx":0848
  60.             Key             =   ""
  61.          EndProperty
  62.          BeginProperty ListImage6 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  63.             Picture         =   "VbDraw.frx":0A5A
  64.             Key             =   ""
  65.          EndProperty
  66.          BeginProperty ListImage7 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  67.             Picture         =   "VbDraw.frx":0C6C
  68.             Key             =   ""
  69.          EndProperty
  70.          BeginProperty ListImage8 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  71.             Picture         =   "VbDraw.frx":0E7E
  72.             Key             =   ""
  73.          EndProperty
  74.       EndProperty
  75.    End
  76.    Begin MSComctlLib.ImageList imlDrawStyles 
  77.       Left            =   1200
  78.       Top             =   2520
  79.       _ExtentX        =   1005
  80.       _ExtentY        =   1005
  81.       BackColor       =   -2147483643
  82.       ImageWidth      =   48
  83.       ImageHeight     =   16
  84.       MaskColor       =   12632256
  85.       _Version        =   393216
  86.       BeginProperty Images {2C247F25-8591-11D1-B16A-00C0F0283628} 
  87.          NumListImages   =   6
  88.          BeginProperty ListImage1 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  89.             Picture         =   "VbDraw.frx":1090
  90.             Key             =   ""
  91.          EndProperty
  92.          BeginProperty ListImage2 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  93.             Picture         =   "VbDraw.frx":12A2
  94.             Key             =   ""
  95.          EndProperty
  96.          BeginProperty ListImage3 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  97.             Picture         =   "VbDraw.frx":14B4
  98.             Key             =   ""
  99.          EndProperty
  100.          BeginProperty ListImage4 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  101.             Picture         =   "VbDraw.frx":16C6
  102.             Key             =   ""
  103.          EndProperty
  104.          BeginProperty ListImage5 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  105.             Picture         =   "VbDraw.frx":18D8
  106.             Key             =   ""
  107.          EndProperty
  108.          BeginProperty ListImage6 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  109.             Picture         =   "VbDraw.frx":1AEA
  110.             Key             =   ""
  111.          EndProperty
  112.       EndProperty
  113.    End
  114.    Begin VB.PictureBox picColorToolbar 
  115.       Align           =   2  'Align Bottom
  116.       Height          =   855
  117.       Left            =   0
  118.       ScaleHeight     =   795
  119.       ScaleWidth      =   9315
  120.       TabIndex        =   2
  121.       Top             =   5730
  122.       Width           =   9375
  123.       Begin MSComctlLib.ImageCombo icbDrawStyle 
  124.          Height          =   330
  125.          Left            =   1920
  126.          TabIndex        =   7
  127.          Top             =   0
  128.          Width           =   1095
  129.          _ExtentX        =   1931
  130.          _ExtentY        =   582
  131.          _Version        =   393216
  132.          ForeColor       =   -2147483640
  133.          BackColor       =   -2147483643
  134.          ImageList       =   "imlDrawStyles"
  135.       End
  136.       Begin VB.PictureBox picBackColorSample 
  137.          Height          =   255
  138.          Index           =   0
  139.          Left            =   840
  140.          ScaleHeight     =   195
  141.          ScaleWidth      =   195
  142.          TabIndex        =   6
  143.          Top             =   240
  144.          Width           =   255
  145.       End
  146.       Begin VB.PictureBox picForeColorSample 
  147.          Height          =   255
  148.          Index           =   0
  149.          Left            =   840
  150.          ScaleHeight     =   195
  151.          ScaleWidth      =   195
  152.          TabIndex        =   5
  153.          Top             =   0
  154.          Width           =   255
  155.       End
  156.       Begin VB.PictureBox picBackColor 
  157.          AutoRedraw      =   -1  'True
  158.          Height          =   255
  159.          Left            =   120
  160.          ScaleHeight     =   195
  161.          ScaleWidth      =   435
  162.          TabIndex        =   4
  163.          Top             =   360
  164.          Width           =   495
  165.       End
  166.       Begin VB.PictureBox picForeColor 
  167.          AutoRedraw      =   -1  'True
  168.          Height          =   255
  169.          Left            =   120
  170.          ScaleHeight     =   195
  171.          ScaleWidth      =   435
  172.          TabIndex        =   3
  173.          Top             =   120
  174.          Width           =   495
  175.       End
  176.       Begin MSComctlLib.ImageCombo icbFillStyle 
  177.          Height          =   330
  178.          Left            =   1920
  179.          TabIndex        =   8
  180.          Top             =   360
  181.          Width           =   1095
  182.          _ExtentX        =   1931
  183.          _ExtentY        =   582
  184.          _Version        =   393216
  185.          ForeColor       =   -2147483640
  186.          BackColor       =   -2147483643
  187.          ImageList       =   "imlFillStyles"
  188.       End
  189.       Begin MSComctlLib.ImageCombo icbDrawWidth 
  190.          Height          =   330
  191.          Left            =   3120
  192.          TabIndex        =   9
  193.          Top             =   0
  194.          Width           =   1095
  195.          _ExtentX        =   1931
  196.          _ExtentY        =   582
  197.          _Version        =   393216
  198.          ForeColor       =   -2147483640
  199.          BackColor       =   -2147483643
  200.          ImageList       =   "imlDrawWidths"
  201.       End
  202.    End
  203.    Begin VB.PictureBox picCanvas 
  204.       BackColor       =   &H00FFFFFF&
  205.       Height          =   2415
  206.       Left            =   480
  207.       ScaleHeight     =   2355
  208.       ScaleWidth      =   3075
  209.       TabIndex        =   1
  210.       Top             =   0
  211.       Width           =   3135
  212.    End
  213.    Begin MSComDlg.CommonDialog dlgFile 
  214.       Left            =   3840
  215.       Top             =   1320
  216.       _ExtentX        =   847
  217.       _ExtentY        =   847
  218.       _Version        =   393216
  219.    End
  220.    Begin MSComctlLib.Toolbar tbrTools 
  221.       Align           =   3  'Align Left
  222.       Height          =   5730
  223.       Left            =   0
  224.       TabIndex        =   0
  225.       Top             =   0
  226.       Width           =   420
  227.       _ExtentX        =   741
  228.       _ExtentY        =   10107
  229.       ButtonWidth     =   609
  230.       ButtonHeight    =   582
  231.       Appearance      =   1
  232.       ImageList       =   "imlTools"
  233.       _Version        =   393216
  234.       BeginProperty Buttons {66833FE8-8583-11D1-B16A-00C0F0283628} 
  235.          NumButtons      =   6
  236.          BeginProperty Button1 {66833FEA-8583-11D1-B16A-00C0F0283628} 
  237.             Key             =   "Arrow"
  238.             Object.ToolTipText     =   "Select"
  239.             ImageIndex      =   1
  240.             Style           =   2
  241.          EndProperty
  242.          BeginProperty Button2 {66833FEA-8583-11D1-B16A-00C0F0283628} 
  243.             Key             =   "Line"
  244.             Object.ToolTipText     =   "Line"
  245.             ImageIndex      =   3
  246.             Style           =   2
  247.          EndProperty
  248.          BeginProperty Button3 {66833FEA-8583-11D1-B16A-00C0F0283628} 
  249.             Key             =   "Scribble"
  250.             Object.ToolTipText     =   "Scribble"
  251.             ImageIndex      =   4
  252.             Style           =   2
  253.          EndProperty
  254.          BeginProperty Button4 {66833FEA-8583-11D1-B16A-00C0F0283628} 
  255.             Key             =   "Polyline"
  256.             Object.ToolTipText     =   "Polyline"
  257.             ImageIndex      =   5
  258.             Style           =   2
  259.          EndProperty
  260.          BeginProperty Button5 {66833FEA-8583-11D1-B16A-00C0F0283628} 
  261.             Key             =   "Polygon"
  262.             Object.ToolTipText     =   "Polygon"
  263.             ImageIndex      =   6
  264.             Style           =   2
  265.          EndProperty
  266.          BeginProperty Button6 {66833FEA-8583-11D1-B16A-00C0F0283628} 
  267.             Key             =   "Rectangle"
  268.             Object.ToolTipText     =   "Rectangle"
  269.             ImageIndex      =   7
  270.             Style           =   2
  271.          EndProperty
  272.       EndProperty
  273.    End
  274.    Begin MSComctlLib.ImageList imlTools 
  275.       Left            =   480
  276.       Top             =   2520
  277.       _ExtentX        =   1005
  278.       _ExtentY        =   1005
  279.       BackColor       =   -2147483643
  280.       ImageWidth      =   16
  281.       ImageHeight     =   16
  282.       MaskColor       =   12632256
  283.       _Version        =   393216
  284.       BeginProperty Images {2C247F25-8591-11D1-B16A-00C0F0283628} 
  285.          NumListImages   =   8
  286.          BeginProperty ListImage1 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  287.             Picture         =   "VbDraw.frx":1CFC
  288.             Key             =   ""
  289.          EndProperty
  290.          BeginProperty ListImage2 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  291.             Picture         =   "VbDraw.frx":1E0E
  292.             Key             =   ""
  293.          EndProperty
  294.          BeginProperty ListImage3 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  295.             Picture         =   "VbDraw.frx":1F20
  296.             Key             =   ""
  297.          EndProperty
  298.          BeginProperty ListImage4 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  299.             Picture         =   "VbDraw.frx":2032
  300.             Key             =   ""
  301.          EndProperty
  302.          BeginProperty ListImage5 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  303.             Picture         =   "VbDraw.frx":2144
  304.             Key             =   ""
  305.          EndProperty
  306.          BeginProperty ListImage6 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  307.             Picture         =   "VbDraw.frx":2256
  308.             Key             =   ""
  309.          EndProperty
  310.          BeginProperty ListImage7 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  311.             Picture         =   "VbDraw.frx":2368
  312.             Key             =   ""
  313.          EndProperty
  314.          BeginProperty ListImage8 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  315.             Picture         =   "VbDraw.frx":247A
  316.             Key             =   ""
  317.          EndProperty
  318.       EndProperty
  319.    End
  320.    Begin MSComctlLib.ImageList imlDrawWidths 
  321.       Left            =   2640
  322.       Top             =   2520
  323.       _ExtentX        =   1005
  324.       _ExtentY        =   1005
  325.       BackColor       =   -2147483643
  326.       ImageWidth      =   48
  327.       ImageHeight     =   16
  328.       MaskColor       =   12632256
  329.       _Version        =   393216
  330.       BeginProperty Images {2C247F25-8591-11D1-B16A-00C0F0283628} 
  331.          NumListImages   =   10
  332.          BeginProperty ListImage1 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  333.             Picture         =   "VbDraw.frx":258C
  334.             Key             =   ""
  335.          EndProperty
  336.          BeginProperty ListImage2 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  337.             Picture         =   "VbDraw.frx":279E
  338.             Key             =   ""
  339.          EndProperty
  340.          BeginProperty ListImage3 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  341.             Picture         =   "VbDraw.frx":29B0
  342.             Key             =   ""
  343.          EndProperty
  344.          BeginProperty ListImage4 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  345.             Picture         =   "VbDraw.frx":2BC2
  346.             Key             =   ""
  347.          EndProperty
  348.          BeginProperty ListImage5 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  349.             Picture         =   "VbDraw.frx":2DD4
  350.             Key             =   ""
  351.          EndProperty
  352.          BeginProperty ListImage6 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  353.             Picture         =   "VbDraw.frx":2FE6
  354.             Key             =   ""
  355.          EndProperty
  356.          BeginProperty ListImage7 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  357.             Picture         =   "VbDraw.frx":31F8
  358.             Key             =   ""
  359.          EndProperty
  360.          BeginProperty ListImage8 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  361.             Picture         =   "VbDraw.frx":340A
  362.             Key             =   ""
  363.          EndProperty
  364.          BeginProperty ListImage9 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  365.             Picture         =   "VbDraw.frx":361C
  366.             Key             =   ""
  367.          EndProperty
  368.          BeginProperty ListImage10 {2C247F27-8591-11D1-B16A-00C0F0283628} 
  369.             Picture         =   "VbDraw.frx":382E
  370.             Key             =   ""
  371.          EndProperty
  372.       EndProperty
  373.    End
  374.    Begin VB.Menu mnuFile 
  375.       Caption         =   "&File"
  376.       Begin VB.Menu mnuFileNew 
  377.          Caption         =   "&New"
  378.          Shortcut        =   ^N
  379.       End
  380.       Begin VB.Menu mnuFileOpen 
  381.          Caption         =   "&Open..."
  382.          Shortcut        =   ^O
  383.       End
  384.       Begin VB.Menu mnuFileOpenSep 
  385.          Caption         =   "-"
  386.       End
  387.       Begin VB.Menu mnuFileSave 
  388.          Caption         =   "&Save"
  389.          Enabled         =   0   'False
  390.          Shortcut        =   ^S
  391.       End
  392.       Begin VB.Menu mnuFileSaveAs 
  393.          Caption         =   "Save &As..."
  394.          Shortcut        =   ^A
  395.       End
  396.       Begin VB.Menu mnuFileSaveBitmapSep 
  397.          Caption         =   "-"
  398.       End
  399.       Begin VB.Menu mnuFileSaveBitmap 
  400.          Caption         =   "Save &Bitmap..."
  401.          Shortcut        =   ^B
  402.       End
  403.       Begin VB.Menu mnuFileSaveMetafile 
  404.          Caption         =   "Save &Metafile..."
  405.          Shortcut        =   ^M
  406.       End
  407.       Begin VB.Menu mnuFileExitSep 
  408.          Caption         =   "-"
  409.       End
  410.       Begin VB.Menu mnuFileExit 
  411.          Caption         =   "E&xit"
  412.       End
  413.       Begin VB.Menu mnuFileMRU 
  414.          Caption         =   "-"
  415.          Index           =   0
  416.          Visible         =   0   'False
  417.       End
  418.    End
  419.    Begin VB.Menu mnuEdit 
  420.       Caption         =   "&Edit"
  421.       Begin VB.Menu mnuEditUndo 
  422.          Caption         =   "&Undo"
  423.          Shortcut        =   ^Z
  424.       End
  425.       Begin VB.Menu mnuEditRedo 
  426.          Caption         =   "&Redo"
  427.          Shortcut        =   ^Y
  428.       End
  429.    End
  430.    Begin VB.Menu mnuArrange 
  431.       Caption         =   "&Arrange"
  432.       Begin VB.Menu mnuArrangeSendToFront 
  433.          Caption         =   "&Bring To Front"
  434.          Enabled         =   0   'False
  435.          Shortcut        =   ^J
  436.       End
  437.       Begin VB.Menu mnuArrangeSendToBack 
  438.          Caption         =   "&Send To Back"
  439.          Enabled         =   0   'False
  440.          Shortcut        =   ^K
  441.       End
  442.    End
  443.    Begin VB.Menu mnuTransform 
  444.       Caption         =   "&Transform"
  445.       Begin VB.Menu mnuTransformClear 
  446.          Caption         =   "&Clear Transformations"
  447.          Enabled         =   0   'False
  448.       End
  449.       Begin VB.Menu mnuTransformRotate 
  450.          Caption         =   "&Rotate..."
  451.          Enabled         =   0   'False
  452.       End
  453.       Begin VB.Menu mnuTransformScale 
  454.          Caption         =   "&Scale..."
  455.          Enabled         =   0   'False
  456.       End
  457.    End
  458. End
  459. Attribute VB_Name = "frmVbDraw"
  460. Attribute VB_GlobalNameSpace = False
  461. Attribute VB_Creatable = False
  462. Attribute VB_PredeclaredId = True
  463. Attribute VB_Exposed = False
  464. Option Explicit
  465.  
  466. ' The new object we are building.
  467. Private m_NewObject As vbdObject
  468. Private m_ToolKey As String
  469.  
  470. ' The selected object.
  471. Private m_SelectedObjects As Collection
  472.  
  473. ' Undo variables.
  474. Private Const MAX_UNDO = 50
  475. Private m_Snapshots As Collection
  476. Private m_CurrentSnapshot As Integer
  477.  
  478. ' The scene that holds all objects.
  479. Private m_TheScene As vbdObject
  480.  
  481. ' The currently selected colors.
  482. Private m_ForeColor As Integer
  483. Private m_BackColor As Integer
  484.  
  485. ' The name and title of the current file.
  486. Private m_FileName As String
  487. Private m_FileTitle As String
  488.  
  489. ' MRU list file names.
  490. Private m_MruList As Collection
  491.  
  492. ' Indicates the data has changed since load/save.
  493. Private m_DataModified As Boolean
  494.  
  495. Private Declare Function CreateMetaFile Lib "gdi32" Alias "CreateMetaFileA" (ByVal lpString As String) As Long
  496. Private Declare Function CloseMetaFile Lib "gdi32" (ByVal hmf As Long) As Long
  497. Private Declare Function DeleteMetaFile Lib "gdi32" (ByVal hmf As Long) As Long
  498. Private Declare Function SetWindowExtEx Lib "gdi32" (ByVal hdc As Long, ByVal nX As Long, ByVal nY As Long, lpSize As SIZE) As Long
  499. Private Type SIZE
  500.     cx As Long
  501.     cy As Long
  502. End Type
  503.  
  504. ' Arrange the color toolbar.
  505. Private Sub ArrangeColorToolbar()
  506. Dim i As Integer
  507. Dim tf As Single
  508. Dim tb As Single
  509. Dim X As Single
  510. Dim dx As Single
  511.  
  512.     tf = (picColorToolbar.ScaleHeight - 2 * picForeColor.Height) / 3
  513.     tb = picForeColor.Height + 2 * tf
  514.  
  515.     ' Arrange the forecolor and backcolor pictures.
  516.     picForeColor.Move tf, tf
  517.     picBackColor.Move tf, tb
  518.     X = picBackColor.Width + 2 * tf
  519.     dx = picForeColorSample(0).Width + tf / 2
  520.  
  521.     ' Create the color samples.
  522.     For i = 0 To 15
  523.         If i > 0 Then
  524.             Load picForeColorSample(i)
  525.             Load picBackColorSample(i)
  526.         End If
  527.  
  528.         picForeColorSample(i).Top = tf
  529.         picForeColorSample(i).Left = X
  530.         picForeColorSample(i).BackColor = QBColor(i)
  531.         picForeColorSample(i).Visible = True
  532.         picBackColorSample(i).Top = tb
  533.         picBackColorSample(i).Left = X
  534.         picBackColorSample(i).BackColor = QBColor(i)
  535.         picBackColorSample(i).Visible = True
  536.         X = X + dx
  537.     Next i
  538.  
  539.     ' Arrange the DrawStyles ImageCombo.
  540.     X = X + dx + tf
  541.     dx = icbFillStyle.Width + tf / 2
  542.     tf = (picColorToolbar.ScaleHeight - 2 * icbDrawStyle.Height) / 3
  543.     tb = icbDrawStyle.Height + 2 * tf
  544.     icbDrawStyle.Top = tf
  545.     icbDrawStyle.Left = X
  546.     Set icbDrawStyle.ImageList = imlDrawStyles
  547.     For i = 1 To 6
  548.         icbDrawStyle.ComboItems.Add i
  549.         icbDrawStyle.ComboItems(i).Image = i
  550.     Next i
  551.  
  552.     ' Arrange the FillStyles ImageCombo.
  553.     icbFillStyle.Top = tb
  554.     icbFillStyle.Left = X
  555.     Set icbFillStyle.ImageList = imlFillStyles
  556.     For i = 1 To 8
  557.         icbFillStyle.ComboItems.Add i
  558.         icbFillStyle.ComboItems(i).Image = i
  559.     Next i
  560.     X = X + dx
  561.  
  562.     ' Arrange the DrawWidth ImageCombo.
  563.     icbDrawWidth.Top = tb
  564.     icbDrawWidth.Left = X
  565.     Set icbDrawWidth.ImageList = imlDrawWidths
  566.     For i = 1 To 10
  567.         icbDrawWidth.ComboItems.Add i
  568.         icbDrawWidth.ComboItems(i).Image = i
  569.     Next i
  570. End Sub
  571.  
  572. ' Return True if it is safe to discard the
  573. ' current picture.
  574. Private Function DataSafe() As Boolean
  575.     If Not m_DataModified Then
  576.         DataSafe = True
  577.     Else
  578.         Select Case MsgBox("The data has been modified. Do you want to save the changes?", vbYesNoCancel)
  579.             Case vbYes
  580.                 mnuFileSave_Click
  581.                 DataSafe = Not m_DataModified
  582.             Case vbNo
  583.                 DataSafe = True
  584.             Case vbCancel
  585.                 DataSafe = False
  586.         End Select
  587.     End If
  588. End Function
  589. ' Save the picture.
  590. Private Sub DataSave(ByVal file_name As String, ByVal file_title As String)
  591. Dim fnum As Integer
  592.  
  593.     On Error GoTo SaveError
  594.  
  595.     ' Open the file.
  596.     fnum = FreeFile
  597.     Open file_name For Output As fnum
  598.  
  599.     ' Write the scene serialization into the file.
  600.     Print #fnum, m_TheScene.Serialization
  601.  
  602.     ' Close the file.
  603.     Close fnum
  604.  
  605.     ' Update the caption.
  606.     SetFileName file_name, file_title
  607.  
  608.     m_DataModified = False
  609.     Exit Sub
  610.  
  611. SaveError:
  612.     MsgBox "Error " & Format$(Err.Number) & _
  613.         " saving file " & file_name & "." & _
  614.         vbCrLf & Err.Description
  615.     Exit Sub
  616. End Sub
  617. ' Load the picture.
  618. Private Sub DataLoad(ByVal file_name As String, ByVal file_title As String)
  619. Dim fnum As Integer
  620. Dim txt As String
  621. Dim token_name As String
  622. Dim token_value As String
  623.  
  624.     On Error GoTo LoadError
  625.  
  626.     ' Open the file.
  627.     fnum = FreeFile
  628.     Open file_name For Input As fnum
  629.  
  630.     ' Read the scene serialization from the file.
  631.     txt = Input$(LOF(fnum), fnum)
  632.  
  633.     ' Close the file.
  634.     Close fnum
  635.  
  636.     ' Initialize the scene.
  637.     GetNamedToken txt, token_name, token_value
  638.     If token_name <> "vbdScene" Then
  639.         MsgBox "Error loading file " & file_name & "." & _
  640.             vbCrLf & "This is not a VbDraw file."
  641.     Else
  642.         m_TheScene.Serialization = token_value
  643.  
  644.         ' Update the caption.
  645.         SetFileName file_name, file_title
  646.         m_DataModified = False
  647.  
  648.         ' Prepare to edit.
  649.         PrepareToEdit
  650.     End If
  651.     Exit Sub
  652.  
  653. LoadError:
  654.     MsgBox "Error " & Format$(Err.Number) & _
  655.         " loading file " & file_name & "." & _
  656.         vbCrLf & Err.Description
  657.     Exit Sub
  658. End Sub
  659.  
  660. ' Deselect this object.
  661. Private Sub DeselectVbdObject(ByVal target As vbdObject)
  662. Dim obj As vbdObject
  663. Dim i As Integer
  664.  
  665.     ' Remove the object from the
  666.     ' m_SelectedObjects collection.
  667.     i = 1
  668.     For Each obj In m_SelectedObjects
  669.         If obj Is target Then
  670.             m_SelectedObjects.Remove i
  671.             Exit For
  672.         End If
  673.         i = i + 1
  674.     Next obj
  675.  
  676.     ' Mark the object as not selected.
  677.     target.Selected = False
  678. End Sub
  679. ' Deselect all objects.
  680. Private Sub DeselectAllVbdObjects()
  681. Dim obj As vbdObject
  682.  
  683.     ' Deselect all selected objects.
  684.     For Each obj In m_SelectedObjects
  685.         obj.Selected = False
  686.     Next obj
  687.  
  688.     ' Empty the m_SelectedObjects collection.
  689.     Set m_SelectedObjects = New Collection
  690. End Sub
  691.  
  692. ' Enable the appropriate transformation menus.
  693. Private Sub EnableMenusForSelection()
  694. Dim objects_selected As Boolean
  695.  
  696.     objects_selected = (m_SelectedObjects.Count > 0)
  697.     mnuArrangeSendToFront.Enabled = objects_selected
  698.     mnuArrangeSendToBack.Enabled = objects_selected
  699.     mnuTransformClear.Enabled = objects_selected
  700.     mnuTransformRotate.Enabled = objects_selected
  701.     mnuTransformScale.Enabled = objects_selected
  702. End Sub
  703.  
  704. ' Select the arrow tool.
  705. Private Sub SelectArrowTool()
  706.     ' Make sure the arrow button is pressed.
  707.     tbrTools.Buttons("Arrow").Value = tbrPressed
  708.  
  709.     ' Prepare to deal with this tool.
  710.     SelectTool "Arrow"
  711. End Sub
  712.  
  713. ' Create an appropriate object for this tool.
  714. Private Sub SelectTool(ByVal Key As String)
  715. Dim new_pgon As vbdPolygon
  716. Dim new_line As vbdLine
  717.  
  718.     ' Free any previously started object.
  719.     Set m_NewObject = Nothing
  720.  
  721.     ' Create the new object.
  722.     m_ToolKey = Key
  723.     Select Case m_ToolKey
  724.         Case "Polyline"
  725.             Set m_NewObject = New vbdPolygon
  726.             Set new_pgon = m_NewObject
  727.             new_pgon.IsClosed = False
  728.         Case "Polygon"
  729.             Set m_NewObject = New vbdPolygon
  730.             Set new_pgon = m_NewObject
  731.             new_pgon.IsClosed = True
  732.         Case "Line"
  733.             Set m_NewObject = New vbdLine
  734.             Set new_line = m_NewObject
  735.             new_line.IsBox = False
  736.         Case "Rectangle"
  737.             Set m_NewObject = New vbdLine
  738.             Set new_line = m_NewObject
  739.             new_line.IsBox = True
  740.         Case "Scribble"
  741.             Set m_NewObject = New vbdScribble
  742. '        Case "Ellipse"
  743. '            Set m_NewObject = New vbdEllipse
  744.     End Select
  745.  
  746.     ' Let the new object receive picCanvas events.
  747.     If Not (m_NewObject Is Nothing) Then
  748.         Set m_NewObject.Canvas = picCanvas
  749.     End If
  750. End Sub
  751. ' Select this object.
  752. Private Sub SelectVbdObject(ByVal target As vbdObject)
  753.     ' See if it is aleady selected.
  754.     If target.Selected Then Exit Sub
  755.  
  756.     ' Add the object to the
  757.     ' m_SelectedObjects collection.
  758.     m_SelectedObjects.Add target
  759.  
  760.     ' Mark the object as selected.
  761.     target.Selected = True
  762. End Sub
  763.  
  764.  
  765. ' Find the object at this position.
  766. Private Function FindObjectAt(ByVal X As Single, ByVal Y As Single) As vbdObject
  767. Dim the_scene As vbdScene
  768.  
  769.     Set the_scene = m_TheScene
  770.     Set FindObjectAt = the_scene.FindObjectAt(X, Y)
  771. End Function
  772. ' Add this file name to the MRU list.
  773. Private Sub MruAddName(ByVal file_name As String)
  774. Dim i As Integer
  775.  
  776.     ' Remove any duplicates.
  777.     For i = m_MruList.Count To 1 Step -1
  778.         If m_MruList(i) = file_name Then
  779.             m_MruList.Remove i
  780.         End If
  781.     Next i
  782.  
  783.     ' Add the new name at the front.
  784.     If m_MruList.Count = 0 Then
  785.         m_MruList.Add file_name
  786.     Else
  787.         m_MruList.Add file_name, , 1
  788.     End If
  789.  
  790.     ' Only keep 4.
  791.     Do While m_MruList.Count > 4
  792.         m_MruList.Remove 5
  793.     Loop
  794.  
  795.     ' Save the MRU list in the registry.
  796.     For i = 1 To m_MruList.Count
  797.         SaveSetting App.Title, "MRU", _
  798.             Format$(i), m_MruList(i)
  799.     Next i
  800.     For i = m_MruList.Count + 1 To 4
  801.         SaveSetting App.Title, "MRU", _
  802.             Format$(i), ""
  803.     Next i
  804.  
  805.     ' Display the MRU list.
  806.     MruDisplay
  807. End Sub
  808. ' Display the MRU list.
  809. Private Sub MruDisplay()
  810. Dim i As Integer
  811.  
  812.     mnuFileMRU(0).Visible = (m_MruList.Count > 0)
  813.     For i = 1 To m_MruList.Count
  814.         If i > mnuFileMRU.UBound Then
  815.             Load mnuFileMRU(i)
  816.         End If
  817.         mnuFileMRU(i).Caption = "&" & _
  818.             Format$(i) & " " & m_MruList(i)
  819.         mnuFileMRU(i).Visible = True
  820.     Next i
  821. End Sub
  822. ' Load the MRU list.
  823. Private Sub MruLoad()
  824. Dim i As Integer
  825. Dim file_name As String
  826.  
  827.     Set m_MruList = New Collection
  828.     For i = 1 To 4
  829.         file_name = GetSetting(App.Title, "MRU", _
  830.             Format$(i), "")
  831.         If Len(file_name) > 0 Then
  832.             m_MruList.Add file_name
  833.         End If
  834.     Next i
  835.  
  836.     ' Display the list.
  837.     MruDisplay
  838. End Sub
  839.  
  840. ' Select default values and prepare to edit.
  841. Private Sub PrepareToEdit()
  842.     ' Select default colors.
  843.     picForeColorSample_Click 0  ' Black
  844.     picbackColorSample_Click 7  ' Gray
  845.  
  846.     ' Save the initial snapshot.
  847.     Set m_Snapshots = New Collection
  848.     m_CurrentSnapshot = 0
  849.     SaveSnapshot
  850.  
  851.     ' Start at normal (pixel) scale.
  852.     picCanvas.ScaleMode = vbPixels
  853.  
  854.     ' Select the arrow tool.
  855.     tbrTools.Buttons("Arrow").Value = tbrPressed
  856.  
  857.     ' Select the solid DrawStyle.
  858.     icbDrawStyle.SelectedItem = icbDrawStyle.ComboItems(1)
  859.  
  860.     ' Select the solid FillStyle.
  861.     icbFillStyle.SelectedItem = icbDrawStyle.ComboItems(1)
  862.  
  863.     ' Select the 1 pixel DrawWidth.
  864.     icbDrawWidth.SelectedItem = icbDrawStyle.ComboItems(1)
  865.  
  866.     ' Redraw.
  867.     picCanvas.Refresh
  868. End Sub
  869. ' Flag the data as modified.
  870. Private Sub SetDirty()
  871.     If Not m_DataModified Then
  872.         Caption = App.Title & "*[" & m_FileTitle & "]"
  873.     End If
  874.  
  875.     ' Save the current snapshot.
  876.     SaveSnapshot
  877.  
  878.     m_DataModified = True
  879. End Sub
  880.  
  881. ' Set the file's name.
  882. Private Sub SetFileName(ByVal file_name As String, ByVal file_title As String)
  883.     ' Save the file's name and title.
  884.     m_FileName = file_name
  885.     m_FileTitle = file_title
  886.     mnuFileSave.Enabled = Len(m_FileTitle) > 0
  887.  
  888.     ' Update the caption.
  889.     Caption = App.Title & " [" & m_FileTitle & "]"
  890.  
  891.     ' Add the name to the MRU list.
  892.     If Len(m_FileName) > 0 Then MruAddName m_FileName
  893. End Sub
  894. ' Enable or disable the undo and redo menus.
  895. Private Sub SetUndoMenus()
  896.     mnuEditUndo.Enabled = (m_CurrentSnapshot > 1)
  897.     mnuEditRedo.Enabled = (m_CurrentSnapshot < m_Snapshots.Count)
  898. End Sub
  899.  
  900. ' Save a snapshot for undo.
  901. Private Sub SaveSnapshot()
  902.     ' Remove any previously undone snapshots.
  903.     Do While m_Snapshots.Count > m_CurrentSnapshot
  904.         m_Snapshots.Remove m_Snapshots.Count
  905.     Loop
  906.  
  907.     ' Save the current snapshot.
  908.     m_Snapshots.Add m_TheScene.Serialization
  909.     If m_Snapshots.Count > MAX_UNDO + 1 Then
  910.         m_Snapshots.Remove 1
  911.     End If
  912.     m_CurrentSnapshot = m_Snapshots.Count
  913.  
  914.     ' Enable/disable the undo and redo menus.
  915.     SetUndoMenus
  916. End Sub
  917.  
  918. ' Add this object to the collection.
  919. Public Sub AddObject(ByVal obj As vbdObject)
  920. Dim the_scene As vbdScene
  921.  
  922.     ' Give the object its drawing properties.
  923.     obj.ForeColor = QBColor(m_ForeColor)
  924.     obj.FillColor = QBColor(m_BackColor)
  925.     obj.DrawStyle = icbDrawStyle.SelectedItem.Index - 1
  926.     obj.FillStyle = icbFillStyle.SelectedItem.Index - 1
  927.     obj.DrawWidth = icbDrawWidth.SelectedItem.Index
  928.  
  929.     ' Save the new object.
  930.     Set the_scene = m_TheScene
  931.     the_scene.SceneObjects.Add obj
  932.     Set m_NewObject = Nothing
  933.  
  934.     ' Select the new object only.
  935.     DeselectAllVbdObjects
  936.     SelectVbdObject obj
  937.  
  938.     ' See if any objects are selected.
  939.     EnableMenusForSelection
  940.  
  941.     ' Select the arrow tool.
  942.     SelectArrowTool
  943.  
  944.     ' The data has changed.
  945.     SetDirty
  946.  
  947.     ' Redraw.
  948.     picCanvas.Refresh
  949. End Sub
  950. ' Cancel adding an object to the collection.
  951. Public Sub CancelObject()
  952.     Set m_NewObject = Nothing
  953.  
  954.     ' Select the arrow tool.
  955.     SelectArrowTool
  956. End Sub
  957.  
  958. ' Restore the previous snapshot.
  959. Private Sub Undo()
  960. Dim token_name As String
  961. Dim token_value As String
  962.  
  963.     If m_CurrentSnapshot <= 1 Then Exit Sub
  964.  
  965.     ' Restore the previous snapshot.
  966.     m_CurrentSnapshot = m_CurrentSnapshot - 1
  967.     GetNamedToken m_Snapshots(m_CurrentSnapshot), token_name, token_value
  968.     m_TheScene.Serialization = token_value
  969.  
  970.     ' Display the scene.
  971.     picCanvas.Refresh
  972.  
  973.     ' Enable/disable the undo and redo menus.
  974.     SetUndoMenus
  975. End Sub
  976. ' Reapply a previously undone snapshot.
  977. Private Sub Redo()
  978. Dim token_name As String
  979. Dim token_value As String
  980.  
  981.     If m_CurrentSnapshot >= m_Snapshots.Count Then Exit Sub
  982.  
  983.     ' Restore the previous snapshot.
  984.     m_CurrentSnapshot = m_CurrentSnapshot + 1
  985.  
  986.     GetNamedToken m_Snapshots(m_CurrentSnapshot), token_name, token_value
  987.     m_TheScene.Serialization = token_value
  988.  
  989.     ' Display the scene.
  990.     picCanvas.Refresh
  991.  
  992.     ' Enable/disable the undo and redo menus.
  993.     SetUndoMenus
  994. End Sub
  995.  
  996. ' Process key presses.
  997. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  998. Dim the_scene As vbdScene
  999.  
  1000.     Select Case KeyCode
  1001.         Case vbKeyDelete
  1002.             If m_SelectedObjects.Count > 0 Then
  1003.                 ' Delete the selected objects.
  1004.                 Set the_scene = m_TheScene
  1005.                 the_scene.RemoveObjects m_SelectedObjects
  1006.  
  1007.                 ' The data has changed.
  1008.                 SetDirty
  1009.                 picCanvas.Refresh
  1010.             End If
  1011.     End Select
  1012. End Sub
  1013.  
  1014. Private Sub Form_Load()
  1015.     picHidden.Visible = False
  1016.     picHidden.AutoRedraw = True
  1017.     picHidden.ScaleMode = vbPixels
  1018.     picHidden.BackColor = vbWhite
  1019.     picHidden.BorderStyle = vbFixedSingle
  1020.  
  1021.     ' Load the MRU list.
  1022.     MruLoad
  1023.  
  1024.     ' Prepare the dialog.
  1025.     dlgFile.CancelError = True
  1026.     dlgFile.InitDir = App.Path
  1027.  
  1028.     ' Arrange the color toolbar.
  1029.     ArrangeColorToolbar
  1030.  
  1031.     ' Start a new picture.
  1032.     mnuFileNew_Click
  1033. End Sub
  1034.  
  1035. Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  1036.     Cancel = (Not DataSafe())
  1037. End Sub
  1038.  
  1039.  
  1040. Private Sub Form_Resize()
  1041. Dim wid As Single
  1042. Dim hgt As Single
  1043.  
  1044.     wid = ScaleWidth - tbrTools.Width
  1045.     If wid < 120 Then wid = 120
  1046.     hgt = ScaleHeight - picColorToolbar.Height
  1047.     If hgt < 120 Then hgt = 120
  1048.     picCanvas.Move tbrTools.Width, 0, wid, hgt
  1049. End Sub
  1050.  
  1051.  
  1052. ' Move this object to the front of the scene's
  1053. ' object list.
  1054. Private Sub mnuArrangeSendToBack_Click()
  1055. Dim the_scene As vbdScene
  1056.  
  1057.     Set the_scene = m_TheScene
  1058.     the_scene.MoveToBack m_SelectedObjects
  1059.  
  1060.     ' The data has changed.
  1061.     SetDirty
  1062.     picCanvas.Refresh
  1063. End Sub
  1064. ' Move this object to the front of the scene's
  1065. ' object list.
  1066. Private Sub mnuArrangeSendToFront_Click()
  1067. Dim the_scene As vbdScene
  1068.  
  1069.     Set the_scene = m_TheScene
  1070.     the_scene.MoveToFront m_SelectedObjects
  1071.  
  1072.     ' The data has changed.
  1073.     SetDirty
  1074.     picCanvas.Refresh
  1075. End Sub
  1076.  
  1077. Private Sub mnuEditRedo_Click()
  1078.     Redo
  1079. End Sub
  1080.  
  1081. Private Sub mnuEditUndo_Click()
  1082.     Undo
  1083. End Sub
  1084.  
  1085.  
  1086. Private Sub mnuFileExit_Click()
  1087.     Unload Me
  1088. End Sub
  1089.  
  1090. ' Load the selected file.
  1091. Private Sub mnuFileMRU_Click(Index As Integer)
  1092. Dim pos As Integer
  1093. Dim file_title As String
  1094.  
  1095.     If Not DataSafe() Then Exit Sub
  1096.  
  1097.     pos = InStrRev(m_MruList(Index), "\")
  1098.     file_title = Mid$(m_MruList(Index), pos + 1)
  1099.     DataLoad m_MruList(Index), file_title
  1100. End Sub
  1101.  
  1102. ' Start a new picture.
  1103. Private Sub mnuFileNew_Click()
  1104.     If Not DataSafe() Then Exit Sub
  1105.  
  1106.     ' Create a new, empty scene object.
  1107.     Set m_TheScene = New vbdScene
  1108.  
  1109.     ' No objects are selected.
  1110.     Set m_SelectedObjects = New Collection
  1111.  
  1112.     ' Blank the file name.
  1113.     SetFileName "", ""
  1114.  
  1115.     ' The data has not been modified.
  1116.     m_DataModified = False
  1117.  
  1118.     ' Prepare to edit.
  1119.     PrepareToEdit
  1120. End Sub
  1121.  
  1122. ' Load a file.
  1123. Private Sub mnuFileOpen_Click()
  1124. Dim file_name As String
  1125.  
  1126.     dlgFile.Flags = cdlOFNExplorer Or _
  1127.         cdlOFNHideReadOnly Or _
  1128.         cdlOFNLongNames Or _
  1129.         cdlOFNFileMustExist
  1130.     dlgFile.Filter = "VbDraw Files (*.drw)|*.drw|" & _
  1131.         "All Files (*.*)|*.*"
  1132.     On Error Resume Next
  1133.     dlgFile.ShowOpen
  1134.     If Err.Number = cdlCancel Then
  1135.         Exit Sub
  1136.     ElseIf Err.Number <> 0 Then
  1137.         MsgBox "Error " & Format$(Err.Number) & _
  1138.             " selecting file." & vbCrLf & _
  1139.             Err.Description
  1140.         Exit Sub
  1141.     End If
  1142.  
  1143.     file_name = dlgFile.FileName
  1144.     dlgFile.InitDir = Left$(file_name, Len(file_name) _
  1145.         - Len(dlgFile.FileTitle) - 1)
  1146.     DataLoad file_name, dlgFile.FileTitle
  1147. End Sub
  1148.  
  1149. ' Save the data using the current file name.
  1150. Private Sub mnuFileSave_Click()
  1151.     If Len(m_FileName) = 0 Then
  1152.         ' There is no file name. Use Save As.
  1153.         mnuFileSaveAs_Click
  1154.     Else
  1155.         ' Save the data.
  1156.         DataSave m_FileName, m_FileTitle
  1157.     End If
  1158. End Sub
  1159. ' Save the picture with a new file name.
  1160. Private Sub mnuFileSaveAs_Click()
  1161. Dim file_name As String
  1162.  
  1163.     dlgFile.Flags = cdlOFNExplorer Or _
  1164.         cdlOFNHideReadOnly Or _
  1165.         cdlOFNLongNames Or _
  1166.         cdlOFNOverwritePrompt
  1167.     dlgFile.Filter = "VbDraw Files (*.drw)|*.drw|" & _
  1168.         "All Files (*.*)|*.*"
  1169.     On Error Resume Next
  1170.     dlgFile.ShowSave
  1171.     If Err.Number = cdlCancel Then
  1172.         Exit Sub
  1173.     ElseIf Err.Number <> 0 Then
  1174.         MsgBox "Error " & Format$(Err.Number) & _
  1175.             " selecting file." & vbCrLf & _
  1176.             Err.Description
  1177.         Exit Sub
  1178.     End If
  1179.  
  1180.     file_name = dlgFile.FileName
  1181.     dlgFile.InitDir = Left$(file_name, Len(file_name) _
  1182.         - Len(dlgFile.FileTitle) - 1)
  1183.     DataSave file_name, dlgFile.FileTitle
  1184. End Sub
  1185.  
  1186. ' Save a bitmap image.
  1187. Private Sub mnuFileSaveBitmap_Click()
  1188. Dim old_file_name As String
  1189. Dim pos As Integer
  1190. Dim file_name As String
  1191.  
  1192.     old_file_name = dlgFile.FileName
  1193.     pos = InStrRev(old_file_name, ".")
  1194.     If pos > 0 Then dlgFile.FileName = Left$(old_file_name, pos) & "bmp"
  1195.  
  1196.     dlgFile.Flags = cdlOFNExplorer Or _
  1197.         cdlOFNHideReadOnly Or _
  1198.         cdlOFNLongNames Or _
  1199.         cdlOFNOverwritePrompt
  1200.     dlgFile.Filter = "Bitmap Files (*.bmp)|*.bmp|" & _
  1201.         "All Files (*.*)|*.*"
  1202.     On Error Resume Next
  1203.     dlgFile.ShowSave
  1204.     If Err.Number = cdlCancel Then
  1205.         Exit Sub
  1206.     ElseIf Err.Number <> 0 Then
  1207.         MsgBox "Error " & Format$(Err.Number) & _
  1208.             " selecting file." & vbCrLf & _
  1209.             Err.Description
  1210.         Exit Sub
  1211.     End If
  1212.  
  1213.     file_name = dlgFile.FileName
  1214.     dlgFile.InitDir = Left$(file_name, Len(file_name) _
  1215.         - Len(dlgFile.FileTitle) - 1)
  1216.  
  1217.     ' Make picHidden big enough to hold everything.
  1218.     picHidden.Width = picCanvas.Width
  1219.     picHidden.Height = picCanvas.Height
  1220.  
  1221.     ' Erase the picture.
  1222.     picHidden.Line (picHidden.ScaleLeft, picHidden.ScaleTop)-Step(picHidden.ScaleWidth, picHidden.ScaleHeight), vbWhite, BF
  1223.  
  1224.     ' Deselect all the objects.
  1225.     DeselectAllVbdObjects
  1226.     picCanvas.Refresh
  1227.  
  1228.     ' Draw the bitmap on picHidden.
  1229.     m_TheScene.Draw picHidden
  1230.     picHidden.Picture = picHidden.Image
  1231.  
  1232.     ' Save the bitmap.
  1233.     SavePicture picHidden.Picture, file_name
  1234.  
  1235.     dlgFile.FileName = old_file_name
  1236. End Sub
  1237.  
  1238. ' Save the objects in a metafile.
  1239. Private Sub mnuFileSaveMetafile_Click()
  1240. Dim old_file_name As String
  1241. Dim pos As Integer
  1242. Dim file_name As String
  1243. Dim mf_dc As Long
  1244. Dim hmf As Long
  1245. Dim old_size As SIZE
  1246.  
  1247.     old_file_name = dlgFile.FileName
  1248.     pos = InStrRev(old_file_name, ".")
  1249.     If pos > 0 Then dlgFile.FileName = Left$(old_file_name, pos) & "wmf"
  1250.  
  1251.     dlgFile.Flags = cdlOFNExplorer Or _
  1252.         cdlOFNHideReadOnly Or _
  1253.         cdlOFNLongNames Or _
  1254.         cdlOFNOverwritePrompt
  1255.     dlgFile.Filter = "Metafiles (*.wmf)|*.wmf|" & _
  1256.         "All Files (*.*)|*.*"
  1257.     On Error Resume Next
  1258.     dlgFile.ShowSave
  1259.     If Err.Number = cdlCancel Then
  1260.         Exit Sub
  1261.     ElseIf Err.Number <> 0 Then
  1262.         MsgBox "Error " & Format$(Err.Number) & _
  1263.             " selecting file." & vbCrLf & _
  1264.             Err.Description
  1265.         Exit Sub
  1266.     End If
  1267.  
  1268.     file_name = dlgFile.FileName
  1269.     dlgFile.InitDir = Left$(file_name, Len(file_name) _
  1270.         - Len(dlgFile.FileTitle) - 1)
  1271.  
  1272.     ' Create the metafile.
  1273.     mf_dc = CreateMetaFile(ByVal file_name)
  1274.     If mf_dc = 0 Then
  1275.         MsgBox "Error creating the metafile.", vbExclamation
  1276.         Exit Sub
  1277.     End If
  1278.  
  1279.     ' Set the metafile's size to something reasonable.
  1280.     SetWindowExtEx mf_dc, picCanvas.ScaleWidth, _
  1281.         picCanvas.ScaleHeight, old_size
  1282.  
  1283.     ' Draw in the metafile.
  1284.     m_TheScene.DrawInMetafile mf_dc
  1285.  
  1286.     ' Close the metafile.
  1287.     hmf = CloseMetaFile(mf_dc)
  1288.     If hmf = 0 Then
  1289.         MsgBox "Error closing the metafile.", vbExclamation
  1290.     End If
  1291.  
  1292.     ' Delete the metafile to free resources.
  1293.     If DeleteMetaFile(hmf) = 0 Then
  1294.         MsgBox "Error deleting the metafile.", vbExclamation
  1295.     End If
  1296.  
  1297.     dlgFile.FileName = old_file_name
  1298. End Sub
  1299.  
  1300.  
  1301. ' Clear the selected objects' transformations.
  1302. Private Sub mnuTransformClear_Click()
  1303. Dim obj As vbdObject
  1304.  
  1305.     For Each obj In m_SelectedObjects
  1306.         obj.ClearTransformation
  1307.     Next obj
  1308.  
  1309.     ' The data has changed.
  1310.     SetDirty
  1311.     picCanvas.Refresh
  1312. End Sub
  1313.  
  1314. ' Rotate the selected objects.
  1315. Private Sub mnuTransformRotate_Click()
  1316. Const PI = 3.14159265
  1317.  
  1318. Dim txt As String
  1319. Dim angle As Single
  1320. Dim xmin As Single
  1321. Dim ymin As Single
  1322. Dim xmax As Single
  1323. Dim ymax As Single
  1324. Dim xmid As Single
  1325. Dim ymid As Single
  1326. Dim obj As vbdObject
  1327. Dim M(1 To 3, 1 To 3) As Single
  1328.  
  1329.     ' Get the angle of rotation.
  1330.     txt = InputBox("Angle (degrees)", "Angle", "")
  1331.     txt = Trim$(txt)
  1332.     If Len(txt) = 0 Then Exit Sub
  1333.     If Not IsNumeric(txt) Then Exit Sub
  1334.     angle = CSng(txt) * PI / 180
  1335.  
  1336.     ' Bound the selected objects.
  1337.     BoundObjects m_SelectedObjects, xmin, ymin, xmax, ymax
  1338.  
  1339.     ' Make the transformation matrix.
  1340.     xmid = (xmin + xmax) / 2
  1341.     ymid = (ymin + ymax) / 2
  1342.     m2RotateAround M, angle, xmid, ymid
  1343.  
  1344.     ' Add the transformation to the selected objects.
  1345.     For Each obj In m_SelectedObjects
  1346.         obj.AddTransformation M
  1347.     Next obj
  1348.  
  1349.     ' The data has changed.
  1350.     SetDirty
  1351.     picCanvas.Refresh
  1352. End Sub
  1353. ' Let the user scale the selected objects.
  1354. Private Sub mnuTransformScale_Click()
  1355. Dim user_canceled As Boolean
  1356. Dim x_scale As Single
  1357. Dim y_scale As Single
  1358. Dim xmin As Single
  1359. Dim ymin As Single
  1360. Dim xmax As Single
  1361. Dim ymax As Single
  1362. Dim xmid As Single
  1363. Dim ymid As Single
  1364. Dim obj As vbdObject
  1365. Dim M(1 To 3, 1 To 3) As Single
  1366.  
  1367.     user_canceled = dlgScale.ShowForm(x_scale, y_scale)
  1368.     Unload dlgScale
  1369.  
  1370.     ' If the user canceled, do no more.
  1371.     If user_canceled Then Exit Sub
  1372.  
  1373.     ' Bound the selected objects.
  1374.     BoundObjects m_SelectedObjects, xmin, ymin, xmax, ymax
  1375.  
  1376.     ' Make the transformation matrix.
  1377.     xmid = (xmin + xmax) / 2
  1378.     ymid = (ymin + ymax) / 2
  1379.     m2ScaleAt M, x_scale, y_scale, xmid, ymid
  1380.  
  1381.     ' Add the transformation to the selected objects.
  1382.     For Each obj In m_SelectedObjects
  1383.         obj.AddTransformation M
  1384.     Next obj
  1385.  
  1386.     ' The data has changed.
  1387.     SetDirty
  1388.     picCanvas.Refresh
  1389. End Sub
  1390. Private Sub picbackColorSample_Click(Index As Integer)
  1391.     m_BackColor = Index
  1392.     picBackColor.BackColor = picBackColorSample(Index).BackColor
  1393. End Sub
  1394.  
  1395. ' See if we are clicking on an object.
  1396. Private Sub picCanvas_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  1397. Dim obj As vbdObject
  1398.  
  1399.     If Not (m_NewObject Is Nothing) Then Exit Sub
  1400.  
  1401.     ' See where we clicked.
  1402.     Set obj = FindObjectAt(X, Y)
  1403.     If (obj Is Nothing) Then
  1404.         ' Deselect all objects.
  1405.         DeselectAllVbdObjects
  1406.     Else
  1407.         ' See if the Shift key is pressed.
  1408.         If (Shift And vbShiftMask) Then
  1409.             ' Shift is pressed. Toggle this
  1410.             ' object's selection.
  1411.             If obj.Selected Then
  1412.                 DeselectVbdObject obj
  1413.             Else
  1414.                 SelectVbdObject obj
  1415.             End If
  1416.         Else
  1417.             ' Shift is not pressed. Select only
  1418.             ' this object.
  1419.             DeselectAllVbdObjects
  1420.             SelectVbdObject obj
  1421.         End If
  1422.     End If
  1423.  
  1424.     ' See if any objects are selected.
  1425.     EnableMenusForSelection
  1426.  
  1427.     picCanvas.Refresh
  1428. End Sub
  1429. Private Sub picCanvas_Paint()
  1430.     m_TheScene.Draw picCanvas
  1431. End Sub
  1432.  
  1433.  
  1434. Private Sub picForeColorSample_Click(Index As Integer)
  1435.     m_ForeColor = Index
  1436.     picForeColor.BackColor = picForeColorSample(Index).BackColor
  1437. End Sub
  1438.  
  1439. ' The user has pressed a button. Prepare to
  1440. ' handle this kind of object.
  1441. Public Sub tbrTools_ButtonClick(ByVal Button As MSComctlLib.Button)
  1442.     SelectTool Button.Key
  1443. End Sub
  1444.